package database;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;

import javax.swing.ImageIcon;

import model.Bod;
import model.Gebruiker;
import model.Veiling;

public class ReadDAO {

	private static DBmanager dbm = DBmanager.getInstance();




	public ArrayList<Veiling> getVeilingen (){
		PreparedStatement ps = null;
		ArrayList<Veiling> retVal = new ArrayList<Veiling>();
		try {
			ps = dbm.getConnection().prepareStatement("SELECT * FROM Veilingen ORDER BY eindtijd ASC");
			ps.setMaxRows(20);
			ResultSet rs = ps.executeQuery();

			while (rs.next()){
				String titel = rs.getString("titel");					//titel
				String imageurl =  rs.getString("foto");			//foto
				
				ImageIcon foto = new ImageIcon(imageurl);				
				double prijs = rs.getDouble("prijs");					//prijs
				
				Calendar eindtijd = Calendar.getInstance();				//eindtijd
				Timestamp timestamp = rs.getTimestamp("eindtijd");
				eindtijd.setTime(timestamp);
								
				int verkoperid = rs.getInt("verkoperid");				//verkoper
				Gebruiker verkoper = getGebruiker(verkoperid);
				String omschrijving = rs.getString("omschrijving");		//omschrijving
				int veilingid = rs.getInt("id");						//veilingid

				Veiling veiling = new Veiling(titel, foto, prijs, verkoper, omschrijving);
				veiling.setId(veilingid);
				veiling.setEindtijd(eindtijd);
				
				double highestbid = getHighestBid(veilingid, prijs);
				if(highestbid == 0){
					veiling.setHighestBid(prijs);
				}else {
					
					veiling.setHighestBid(highestbid);
				}
				
				retVal.add(veiling);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return retVal;
	}

	public ArrayList<Veiling> getVeilingVanGebruiker(int gebruikerid){
		PreparedStatement ps = null;
		ArrayList<Veiling> retVal = new ArrayList<Veiling>();
		try {
			ps = dbm.getConnection().prepareStatement("SELECT * FROM Veilingen WHERE verkoperid=?");
			ps.setInt(1, gebruikerid);
			ResultSet rs = ps.executeQuery();

			while (rs.next()){
				String titel = rs.getString("titel");					//titel
				String imageurl =  rs.getString("foto");			//foto
				ImageIcon foto = new ImageIcon(imageurl);				
				double prijs = rs.getDouble("prijs");					//prijs
				Calendar eindtijd = Calendar.getInstance();				//eindtijd
				Timestamp timestamp = rs.getTimestamp("eindtijd");
				eindtijd.setTime(timestamp);	
				
				Gebruiker verkoper = getGebruiker(gebruikerid);			//verkoper
				String omschrijving = rs.getString("omschrijving");		//omschrijving
				int veilingid = rs.getInt("id");						//veilingid

				Veiling veiling = new Veiling(titel, foto, prijs, verkoper, omschrijving);
				veiling.setId(veilingid);
				veiling.setEindtijd(eindtijd);
				
				
				double highestbid = getHighestBid(veilingid, prijs);
				if(highestbid == 0){
					veiling.setHighestBid(prijs);
				}else {
					
					veiling.setHighestBid(highestbid);
				}
				
				
				retVal.add(veiling);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return retVal;
	}
	
	public Gebruiker getGebruikerMetInlognaamEnWachtwoord(String inlognaam, String wachtwoord){
		Gebruiker retVal = null;
		
		PreparedStatement ps = null;
		try{
			ps = dbm.getConnection().prepareStatement("SELECT * FROM Gebruikers WHERE inlognaam=? AND wachtwoord=?");
			ps.setString(1, inlognaam);
			ps.setString(2, wachtwoord);
			ResultSet rs = ps.executeQuery();

			while(rs.next()){
				String voornaam = rs.getString("voornaam");
				String achternaam = rs.getString("achternaam");
				retVal = new Gebruiker(voornaam, achternaam, inlognaam, wachtwoord);
				int id = getIdVanGebruiker(retVal);
				retVal.setId(id);
			}

		} catch(SQLException e){
			e.printStackTrace();
		}
		return retVal;
	}

	public Veiling getVeiling(int veilingid){
		PreparedStatement ps = null;
		Veiling veiling = null;
		try {
			ps = dbm.getConnection().prepareStatement("SELECT * FROM Veilingen WHERE id=?");
			ps.setInt(1, veilingid);
			ResultSet rs = ps.executeQuery();

			while (rs.next()){
				String titel = rs.getString("titel");					//titel
				String imageurl =  rs.getString("foto");			//foto
				ImageIcon foto = new ImageIcon(imageurl);				
				double prijs = rs.getDouble("prijs");					//prijs
				Calendar eindtijd = Calendar.getInstance();				//eindtijd
				Timestamp timestamp = rs.getTimestamp("eindtijd");
				eindtijd.setTime(timestamp);
				
				
				Gebruiker verkoper = getGebruiker(rs.getInt("verkoperid"));		//verkoper
				String omschrijving = rs.getString("omschrijving");		//omschrijving

				veiling = new Veiling(titel, foto, prijs, verkoper, omschrijving);
				veiling.setId(veilingid);
				veiling.setEindtijd(eindtijd);
				double highestbid = getHighestBid(veilingid, prijs);
				if(highestbid == 0){
					veiling.setHighestBid(prijs);
				}else {
					
					veiling.setHighestBid(highestbid);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} 
		return veiling;
	}

	public double getHighestBid(int veilingid, double prijs){
		PreparedStatement ps = null;
		double retVal = prijs;
		try{
			ps = dbm.getConnection().prepareStatement("SELECT * FROM Biedingen WHERE veilingid=? ORDER BY prijs DESC");
			ps.setInt(1, veilingid);
			ResultSet rs = ps.executeQuery();

			while(rs.next()){
				if(rs.getDouble("prijs") > retVal){
					retVal = rs.getDouble("prijs");
				}
			}

		} catch(SQLException e){
			e.printStackTrace();
		}
		return retVal;
	}
	

	public Gebruiker getGebruiker(int verkoperid){
		PreparedStatement ps = null;
		Gebruiker verkoper = null;
		try{
			ps = dbm.getConnection().prepareStatement("SELECT * FROM Gebruikers WHERE id=?");
			ps.setInt(1, verkoperid);
			ResultSet rs = ps.executeQuery();

			while(rs.next()){
				String voornaam = rs.getString("voornaam");
				String achternaam = rs.getString("achternaam");
				String inlognaam = rs.getString("inlognaam");
				String wachtwoord = rs.getString("wachtwoord");
				verkoper = new Gebruiker(voornaam, achternaam, inlognaam, wachtwoord);
				verkoper.setId(verkoperid);
			}

		} catch(SQLException e){
			e.printStackTrace();
		}
		return verkoper;
	}

	public ArrayList<Bod> getBiedingen(int veilingid){
		PreparedStatement ps = null;
		ArrayList<Bod> biedingen = new ArrayList<Bod>();

		try{
			ps = dbm.getConnection().prepareStatement("SELECT * FROM Biedingen WHERE veilingid=? ORDER BY prijs DESC");
			ps.setInt(1, veilingid);
			ps.setMaxRows(5);
			ResultSet rs = ps.executeQuery();

			while(rs.next()){

				Veiling veiling = getVeiling(veilingid);
				Gebruiker bieder = getGebruiker(rs.getInt("biederid"));
				double prijs = rs.getDouble("prijs");
				long datum = rs.getLong("datum");

				Bod b = new Bod(bieder, veiling, prijs, datum);
				biedingen.add(b);

			}
		} catch(SQLException e){
			e.printStackTrace();
		}

		return biedingen;
	}

	public int getIdVanGebruiker(Gebruiker gebruiker){
		PreparedStatement ps = null;
		int retVal = 0;

		try{
			ps = dbm.getConnection().prepareStatement("SELECT id FROM Gebruikers WHERE voornaam=? AND achternaam=? AND inlognaam=? AND wachtwoord=?");
			ps.setString(1, gebruiker.getVoornaam());
			ps.setString(2, gebruiker.getAchternaam());
			ps.setString(3, gebruiker.getInlognaam());
			ps.setString(4, gebruiker.getWachtwoord());
			ResultSet rs = ps.executeQuery();
			
			while(rs.next()){
				retVal = rs.getInt("id");
			}
		} catch (SQLException e){
			e.printStackTrace();
		} 
		return retVal;
	}

	public boolean getInlognaamExists(String inlognaam) {
		PreparedStatement ps = null;
		boolean retVal = false;

		try{
			ps = dbm.getConnection().prepareStatement("SELECT inlognaam FROM Gebruikers");
			ResultSet rs = ps.executeQuery();
			
			while(rs.next()){
				if(rs.getString("inlognaam").equals(inlognaam)){
					retVal=true;
				}
			}
		} catch (SQLException e){
			e.printStackTrace();
		} 
		return retVal;
	}
	
	public ArrayList<Bod> getBiedingenVanGebruiker(int gebruikerid){
		ArrayList<Bod> biedingen = new ArrayList<Bod>();
		
		PreparedStatement ps = null;

		try{
			ps = dbm.getConnection().prepareStatement("SELECT veilingid, biederid, prijs, datum FROM Biedingen WHERE biederid=? ORDER BY prijs DESC");
			ps.setInt(1, gebruikerid);
			ResultSet rs = ps.executeQuery();
			ArrayList<Integer> ids = new ArrayList<Integer>();
			
			while(rs.next()){
				int veilingid = rs.getInt("veilingid");
				Gebruiker gebruiker = getGebruiker(gebruikerid);
				Veiling veiling = getVeiling(veilingid);
				double prijs=  rs.getDouble("prijs");
				long datum = rs.getLong("datum");
				//alleen unieke veilingen:
				if(!ids.contains(veilingid)){
					ids.add(veilingid);
					Bod bod = new Bod(gebruiker, veiling, prijs, datum);
					bod.setVeiling(veiling);
					biedingen.add(bod);
				}
			}
		} catch (SQLException e){
			e.printStackTrace();
		} 
		
		return biedingen;
	}
	
	public ArrayList<Bod> getWonAuctions(int gebruikerid){
		ArrayList<Bod> wonauctions = new ArrayList<Bod>();
		ArrayList<Integer> ids = new ArrayList<Integer>();
		
		PreparedStatement ps = null;

		try{
			ps = dbm.getConnection().prepareStatement("SELECT * FROM Biedingen WHERE biederid=? ORDER BY prijs DESC");
			ps.setInt(1, gebruikerid);
			ResultSet rs = ps.executeQuery();
			
			while(rs.next()){
				int veilingid = rs.getInt("veilingid");
				Gebruiker gebruiker = getGebruiker(gebruikerid);
				Veiling veiling = getVeiling(veilingid);
				double prijs =  rs.getDouble("prijs");
				long datum = rs.getLong("datum");
				//alleen unieke veilingen:
				if(!ids.contains(veilingid)){
					ids.add(veilingid);
					Bod bod = new Bod(gebruiker, veiling, prijs, datum);
					bod.setVeiling(veiling);
					
					if(veiling.getExpired() && veiling.getHighestBidDouble() == prijs){
						wonauctions.add(bod);
					}
				}
			}
		} catch (SQLException e){
			e.printStackTrace();
		} 
		
		return wonauctions;
		
	}
	

}
